#include "bsp_exti.h"
#include "bsp_gpio.h"
#include "bsp_int.h"
#include "bsp_beep.h"
#include "bsp_delay.h"
#include "bsp_led.h"

/* 外部设备中断源初始化 */
void exti_init(void)
{
	/* GPIO1_IO18 */
	
	gpio_pin_config_t config;

	/* 1. 初始化IO复用，复用为GPIO1_IO18 */
	IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);

	/*
	 * 
	 * bit[0]		0		SRE,低偏摆率
	 * bit[2:1]		00		Reserved（未使用）
	 * bit[5:3]		000		DSE(当gpio位output时，驱动能力)，本节gpio为input模式所以选择DSE=0关闭output
	 * bit[7:6]		10		SPEED,速率,选择100MHz
	 * bit[10:8]	000		Reserved（未使用）
	 * bit[11]		0		ODE, Open Drain 开漏输出模式，本节gpio为input，开漏输出关闭
	 * bit[12]		1		PKE, Pull/Keeper （上拉/保持器 开关），这里使能
	 * bit[13]		1		PUE,（Pull Enable) 选择是Keeper还是PULL，本节这里选择 1 (PULL)
	 * bit[15:14]	11		PUS, (Pull Select) 上拉电阻阻值，本节选择22K欧姆上拉电阻
	 * bit[16]		0		HYS, 磁滞，本节不使用，选择0
	 * bit[31-17]	0		Reserved（未使用)
	 *
	 * 最终选择的电气特性寄存器值:
	 * 1111 0000 1000 0000 = 0xf080
	 */

	/* 2. 设置 UART1_CTS_B IO 的电气特性 */
	IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xf080);


	/* 3. 初始化 GPIO1_IO18 设置为输入 */
	config.directioin = kGPIO_DigitalInput;
	config.intMode = kGPIO_FalllingEdgeInt;
	gpio_init(GPIO1, 18, &config);


	/* 启用GIC IRQ */
	GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);

	/* 注册IRQ处理函数 */
	system_irqhandler_register(GPIO1_Combined_16_31_IRQn, gpio1_io18_int_handler, NULL);

	/* 启用gpio中断 */
	gpio_int_enable(GPIO1, 18);
}


void gpio1_io18_int_handler(IRQn_Type irq, void *userParam)
{
	
	static unsigned char state = OFF;
	// //static unsigned char led_state = ON;
	// int n = 20;
	// int led_state = 0;



	/* 检查 GPIO1_IO18 的ISR */
	if(GPIO1->ISR & (1<<18))
	{
		/* 消抖，等待10ms */
		delay(10);

		/* 等待10ms再次读取gpio input电平值 */
		if(gpio_pinread(GPIO1, 18) == 0)
		{
			state = !state;
			beep_switch(state);
		}
	}
	
	/* 清除外设中断标志位 */
	gpio_int_cleanFlag(GPIO1, 18);
}
